﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Drive</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>

<h1>驱动器</h1>

<p>弹出/收回 CD 或 DVD 驱动器的托盘，或者设定驱动器的卷标。</p>

<p class="CommandSyntax">Drive, 


 Sub-command [, Drive , Value]</p>
<p>如下所述，sub-command、drive，和参数value之间相互依赖。</p>
<p><strong>Label, Drive [, NewLabel]</strong>: 将 <em>Drive</em> (驱动器)的卷标改为 <em>NewLabel</em> (如果省略 <em>NewLabel</em>，驱动器卷标为空)。<em>Drive</em> 是字母后跟一个冒号和可选的反斜杠(可能是UNCs和驱动器映射)。例如：Drive, Label, C:, Seagate200</p>
<p>按照以下例子，取得当前驱动器的卷标：<a href="DriveGet.htm">DriveGet</a>, OutputVar, Label, C:</p>
<p><strong><br>
Lock, Drive</strong>: 锁定驱动器，防止其正在工作的时候被弹出。例如：&quot;Drive, Lock, D:&quot;。大多数的驱动器不能 &quot;locked open&quot;(锁定之后被打开)。然而，在驱动器打开时锁定它，将会使驱动器在关闭后进入锁定状态。对于不支持锁定的驱动器(像大多数的仅读驱动器)，此命令将不起作用。该命令同样不支持 Windows 95/98/Me 下非 IDE 驱动器。如果脚本在结束前锁定了某个驱动器，则该驱动器将一直保持锁定状态，直到其它的脚本或程序将其解锁，或系统重启。如果指定的驱动器不存在或者不支持锁定特性，ErrorLevel (警告级别)将被设为1，否则为0。</p>
<p><br>
<strong>Unlock, Drive</strong>: 功能同上述命令相反。在 Window NT/2000/XP 及以后版本，如果驱动器锁定了多次，则需要多次执行 <em>Unlock</em> 命令。例如，如果 &quot;Drive, Lock, D:&quot; 执行了三次，需要执行三次 &quot;Drive, Unlock, D:&quot; 来解锁。事实上，因为不能确定驱动器是否处于锁定状态，因此，经常需要一个<a href="../Variables.htm">变量</a>来记录锁定的状态。</p>
<p><strong><br>
Eject [, Drive, 1]</strong>: 弹出或收回 CD 或 DVD 驱动器的托盘(弹出其它类型的影音设备或驱动器，请参见本页结尾使用的 DllCall )。</p>
<p>如果省略 <em>Drive</em> ，则使用默认的 CD / DVD 驱动器。省略最后一个参数将则弹出托盘，将其设为 1 则该命令收回或关闭托盘。例如：<em>Drive, Eject, D:, 1</em></p>
<p><em>Drive Eject </em> 命令在托盘弹出或收回完成后返回。如果托盘成功到达指定状态(打开或关闭)，<a href="../misc/ErrorLevel.htm">ErrorLevel</a> 将被设为0(就是&quot;没有错误&quot;)。</p>
<p>对于网络驱动器或者非 CD / DVD 驱动器，<em>Drive Eject </em> 命令很可能无法正常工作。因为这些或其它原因导致的错误，<a href="../misc/ErrorLevel.htm">ErrorLevel</a> 将被设为1。</p>
<p>通过检测执行命令所花费的时间，可以有效地确定托盘以前的状态。例如：下面的热键将触发托盘到相反状态(打开或关闭)：</p>
<pre>#c::
Drive, Eject
<em>; 如果很短时间内完成了这条命令，托盘很可能已经弹出了。</em>
<em>; 那样的话，收回托盘。</em>
if A_TimeSinceThisHotkey &lt; 1000  <em>; 调整到合适的时间。</em>
    Drive, Eject,, 1
return</pre>
<p>如果想测定 CD 或 DVD 的影音播放状态(比如正在播放，暂停，打开等)，请参见 <a href="DriveGet.htm">DriveGet</a> 命令。</p>
<h3>ErrorLevel</h3>
<p>出现错误时，<a href="../misc/ErrorLevel.htm">ErrorLevel</a> 将被设为1，否则为0。</p>
<h3>注意</h3>
<p>下面的例子对弹出方法进行了改动，使之不仅能用于 CD 或 DVD 驱动器，还能用于media/devices(影音设备)：</p>
<pre><em>; 根据需要更新第二行的驱动器标号(不用考虑其它行)。</em>
Driveletter = I:  <em>; 设定为你想弹出的驱动器的标号。</em>

hVolume := DllCall(&quot;CreateFile&quot;
    , Str, &quot;\\.\&quot; . Driveletter
    , UInt, 0x80000000 | 0x40000000  <em>; GENERIC_READ | GENERIC_WRITE</em>
    , UInt, 0x1 | 0x2  <em>; FILE_SHARE_READ | FILE_SHARE_WRITE</em>
    , UInt, 0
    , UInt, 0x3  <em>; OPEN_EXISTING</em>
    , UInt, 0, UInt, 0)
if hVolume &lt;&gt; -1
{
    DllCall(&quot;DeviceIoControl&quot;
        , UInt, hVolume
        , UInt, 0x2D4808   <em>; IOCTL_STORAGE_EJECT_MEDIA</em>
        , UInt, 0, UInt, 0, UInt, 0, UInt, 0
        , UIntP, dwBytesReturned  <em>; Unused.</em>
        , UInt, 0)
    DllCall(&quot;CloseHandle&quot;, UInt, hVolume)
}</pre>
<h3>相关命令</h3>
<p><a href="DriveGet.htm">DriveGet</a>, <a href="DriveSpaceFree.htm">DriveSpaceFree</a></p>
<h3>示例</h3>
<pre class="NoIndent">Drive, Label, D:, BackupDrive
Drive, Eject,, 1 <em>; 收回(关闭)默认 CD 或 DVD 驱动器的托盘。</em></pre>

</body>
</html>
